let prop = 'name';
const info = {
	name: 'listen',
	[`my${prop}is`]: 'lison',
};
console.log('info', info);

const s5 = Symbol('name');
const info2 = {
	[s5]: 'liston',
	age: 18,
	sex: 'male',
};
console.log('info2', info2);
for (let val in info2) {
	console.log(val, info2[val]);
}
console.log('keys', Object.keys(info2));
info2[s5] = 'haha';
console.log({
	getOwnPropertyNames: Object.getOwnPropertyNames(info2),
	STRINGIFY: JSON.stringify(info2),
	getOwnPropertySymbols: Object.getOwnPropertySymbols(info2),
	'Reflect.ownKeys': Reflect.ownKeys(info2),
});

const s8 = Symbol.for('woshai'); // 内部相同即相同
const s9 = Symbol.for('woshai');
console.log(s8 === Symbol.for('s8'));
console.log('symbol.keyfor', Symbol.keyFor(s8)); //寻找 Symbol.for 的定义传入内容;

/**
 *
 * Symbol.hasInstance用于判断某对象是否为某构造器的实例。
 * 因此你可以用它自定义 instanceof 操作符在某个类上的行为。
 *
 * */

class Array1 {
	static [Symbol.hasInstance](instance) {
		return Array.isArray(instance);
	}
}

console.log('hasInstance Demo', [] instanceof Array1);

/**
 *
 * 知名的 Symbol.species 是个函数值属性，其被构造函数用以创建派生对象。
 *
 * */

class Array2 extends Array {
	constructor(...arg) {
		super(...arg);
	}
	static get [Symbol.species]() {
		return Array;
	}
	getName() {
		console.log('listen');
	}
}
const a2 = new Array2([1, 2, 3]);
const a3 = a2.map((i) => i + 1);

console.log('Symbol.species', a3 instanceof Array2, a3 instanceof Array);
